/*************************************************
 * @autheur : CHOLLET Clément et LEMOUEL Florian *
 * @date    : 03.04.2013                         *
 * @version : 1.0 - Création de la classe        *
 *************************************************/

#ifndef MATERIAUX_H
#define MATERIAUX_H

/*********************************************************************
 * Importation de la bibliothèque QT relative aux primitives OPEN GL *
 *********************************************************************/
#include <QtOpenGL>
#include "lumiere.h"
#include <QColor>

#include "boost/serialization/serialization.hpp"
#include <boost/serialization/export.hpp>

/*********************************************************************************************************************************************
 *                                                          Classe de gestion des materiaux                                                  *
 *********************************************************************************************************************************************/
class Materiaux
{

//-----------------------------------------------------Constructeurs et destructeurs-----------------------------------------------------//
public:
    //Constructeur par défaut
    Materiaux();

    //Constructeur par recopie
    Materiaux(const Materiaux& materiaux);

    //Destructeur
    ~Materiaux();
//----------------------------------------------------------------Méthodes---------------------------------------------------------------//
public:
    //Mise en place des propriétés du matériau
    void initialisation();

//---------------------------------------------------------------Accesseurs--------------------------------------------------------------//
public:
    //On affecte les composantes rouge, verte, bleue et le paramètre alpha à la couleur ambiante
    void setCouleurAmbiante(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha);

    //On affecte les composantes rouge, verte, bleue et le paramètre alpha à la couleur diffuse
    void setCouleurDiffuse(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha);

    //On affecte les composantes rouge, verte, bleue et le paramètre alpha à la couleur speculaire
    void setCouleurSpeculaire(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha);

    //On affecte une valeur à la variable _brillanceSpeculaire
    void setBrillanceSpeculaire(GLfloat brillance);

    //On affecte les composantes rouge, verte, bleue et le paramètre alpha à la couleur Emission
    void setCouleurEmission(GLfloat rouge, GLfloat verte, GLfloat bleue, GLfloat alpha);

    //Accesseur sur la couleur ambiante
    QColor& getCouleurAmbiante();

    //Accesseur sur la couleur diffuse
    QColor& getCouleurDiffuse();

    //Accesseur sur la couleur spéculaire
    QColor& getCouleurSpeculaire();

    //Accesseur sur la couleur de réflexion spéculaire
    QColor& getCouleurEmission();

    //Accesseur sur la brillance
    float getBrillance();

//-------------------------------------------------------Surcharge des opérateurs--------------------------------------------------------//
public:

//--------------------------------------------------------------Attributs----------------------------------------------------------------//
private:
    GLfloat _couleurAmbiante[4];
    GLfloat _couleurDiffuse[4];
    GLfloat _couleurSpeculaire[4];
    GLfloat _brillanceSpeculaire[1];
    GLfloat _couleurEmission[4];
//--------------------- Sérialisation ----------------------------------
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
            ar & _couleurAmbiante;
            ar & _couleurDiffuse;
            ar & _couleurSpeculaire;
            ar & _brillanceSpeculaire;
            ar & _couleurEmission;
    }
//----------------------------------------------------------------------
};

#endif // MATERIAUX_H
